.TITLE MSDRV .IDENT /12.02/ ; ; Copyright (c) 1995-1999 by Mentec Inc., U.S.A. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION 12.02 ; ; PREVIOUSLY MODIFIED BY: ; ; B. S. MCCARTHY ; C. SESTOKAS ; ; MODIFIED BY: ; ; C SESTOKAS 6-NOV-87 ; ; CS022 -- CORRECT TRPHYS ROUTINE TO HANDLE VECTORED ; I/D AND NON I/D SYSTEMS AT RUN TIME ; ; D. Carroll 17-Jun-1993 12.02 ; DC227 -- Allow TRPHYS to be able to handle access to ; ICB pool ; .PAGE ; ; MACRO LIBRARY CALLS ; .MCALL ABODF$,CLKDF$,HWDDF$,PKTDF$,UCBDF$,UMDIO$ ABODF$ ;TASK ABORT CODES CLKDF$ ;CLOCK QUEUE CONTROL BLOCK OFFSETS HWDDF$ ;HARDWARE REGISTERS PKTDF$ ;I/O PACKET OFFSETS UCBDF$ ;UNIT CONTROL BLOCK OFFSETS. UMDIO$ ;USER MODE DIAGNOSITIC DEFINITIONS ; ; BIT DEFINITIONS FOR UCB CHARACTERISTICS WORD # 2 (U.CW2) ; M.PEOV= 100000 ;TAPE PAST LOGICAL END OF VOLUME M.AEOV= 40000 ;TAPE AT LOGICAL END OF VOLUME M.BOT= 20000 ;TAPE IS AT BOT M.1600= 4000 ;UNIT IS 1600 BPI PHASE ENCODED M.HWL= 2000 ;HARDWARE WRITE LOCK M.RWD= 1000 ;UNIT IS REWINDING M.SER= 400 ;SELECT ERROR HAS OCCURRED M.IWR= 200 ;INHIBIT WRITE RETRIES M.SWL= 100 ;SOFTWARE WRITE LOCKED M.TMK= 40 ;ENCOUNTERED TAPE MARK - FWD DIRECTION. M.EOT= 20 ;LAST COMMAND ENCOUNTERED END OF TAPE M.SWAP= 2 ;SWAP BYTES FOR COMPATIBILITY MODE USRBTS= M.IWR!M.SWL!M.SWAP ;STATUS BITS CONTROLLED BY THE USER NEWBTS= M.BOT!M.EOT!M.SER!M.HWL!M.1600 ;STATUS TO BE UPDATED. MOVBTS= M.TMK!M.AEOV ;BITS SET BY TAPE MOTION ; ; FLAG BIT DEFINITIONS FOR CONTROLLER STATUS WORD (CSTAT) ; CS.SER = 40000 ;'SEL ERR' - UNIT OFFLINE STATE. CS.WSS = 20000 ;WAITING FOR SUB-SYSTEM READY CS.TMO = 10000 ;THIS OPERATION HAS TIMED OUT CS.NER = 2000 ;NO ERROR RECOVERY CS.ABO = 1000 ;ABORT IN PROGRESS CS.UMD = 200 ;USER MODE DIAGNOSTIC CS.SFB = 100 ;SPACE FILES VIA SPACE BLKS. CS.RSP = 40 ;REWIND/SPACE IN PROGRESS. CS.LBA = 20 ;LOADING DEVICE MSG BUFFER ADDRESS CS.GST = 10 ;DOING GET CHARACTERISTICS CS.CIP = 1 ;COMMAND IN PROGRESS FLAG .PAGE ; **-DEVICE REGISTER OFFSETS TSBA= -2 ;BUS ADDRESS REGISTER TSDB= -2 ;DATA BUFFER REGISTER TSSR= 0 ;STATUS REGISTER ; **-COMMAND PACKET CMDHDR= 0 ;#1 COMMAND/CONTROL FUNCTION. CMDB2= 2 ;#2 DT TRFR - LO ORD BUF @ .OR. ; NDT TRFR - TMK/RCRD CNT. CMDB3= 4 ;#3 DT TRFR - HI ORD BUF @. CMDB4= 6 ;#4 DT TRFR - BYTE COUNT. ; **-STATUS REGISTER TSSRSV= 10 ;SAVED TSSR DEVICE STATUS REGISTER. ; **-MESSAGE PACKET MSGHDR= 12 ;#1 HEADER WORD - MG.ACK=100000 ; ACK BIT, ; 70000 ; RESERVED, ; 1400 ; CLASS CODE BITS, MG.FMT= 340 ; MESSAGE FORMAT BITS, MG.COD= 37 ; MESSAGE CODE BITS; MC.END=20 ; END, MC.FAL=21 ; FAIL, MC.ERR=22 ; ERROR, MC.ATN=23 ; ATTENTION. MC.LOG=24 ; LOG (NOT USED). MSGLGH= 14 ;#2 MESSAGE LENGHT: #3 - #7. RBPCR= 16 ;#3 RESIDUAL BYTE/FRAME COUNT. XST0= 20 ;#4 EXTENDED STATUS REG 0, XST1= 22 ;#5 1, XST2= 24 ;#6 2, XST3= 26 ;#7 3. ; **-CHARACTERISTIC PACKET CHRWD1= 30 ;#1 > MESSAGE PCKT - LO ORD @, CHRWD2= 32 ;#2 > MESSAGE PCKT - HI ORD @. CHRWD3= 34 ;#3 MESSAGE PACKET LENGHT, CHRWD4= 36 ;#4 I/O CHARACTERISTICS: CH.ESS=200 ; STOP - TMK/TMK, (UNLABELLED CH.ENB=100 ; STOP - BOT/TMK. TAPE) CH.EAI= 40 ; ENABLE ATTENTION INTERRUPT. CH.ERI= 20 ; ENABLE MSG BUFFER RLS INTRUPTS. .PAGE ; ; XST0 BIT DEFENITIONS ; X0.TMK= 100000 ;TAPE MARK DETECTED X0.RLS= 40000 ;RECORD LENGTH SHORT X0.LET= 20000 ;LOGICAL END OF TAPE X0.RLL= 10000 ;RECORD LENGTH LONG X0.WLE= 4000 ;WRITE LOCK ERROR X0.NEF= 2000 ;NON-EXECUTABLE FUNCTION X0.ILC= 1000 ;ILLEGAL COMMAND X0.ILA= 400 ;ILLEGAL ADDRESS X0.MOT= 200 ;TAPE MOTION ON LAST COMMAND. X0.ONL= 100 ;ON LINE X0.IE= 40 ;INTERRUPT ENABLE X0.VCK= 20 ;VOLUME CHECK X0.PED= 10 ;* PHASE ENCODED DRIVE ;* NOT USED - TK25. X0.WLK= 4 ;WRITE LOCK X0.BOT= 2 ;BEGINNING OF TAPE X0.EOT= 1 ;END OF TAPE DETECTED ; ; XST1 BIT DEFENITIONS ; X1.DLT= 100000 ;DATA LATE ; 40000 ;NOT USED. X1.COR= 20000 ;* CORRECTABLE DATA ;** NOT USED - TK25. X1.CRS= 10000 ;* CREASE DETECTED ;** NOT USED - TSV05, TU80. X1.TIG= 4000 ;* TRASH IN GAP X1.NER= 4000 ;* TK25 - NOISE DURING ERASE. X1.DBF= 2000 ;* DESKEW BUFFER FAIL X1.SCK= 1000 ;* SPEED CHECK ;** NOT USED - TK25, TSV05, TU80. X1.RBE= 400 ;! READ BUS PAR ERR ;!! NOT USED - TK25, TS11. X1.IPR= 200 ;* INVALID PREAMBLE X1.SYN= 100 ;* SYNCH ERROR ;** NOT USED - TK25, TSV05, TU80. X1.TN3= 200 ;$ TAPE TRACK #3. \ X1.TN2= 100 ;$ | | #2. \ TK25 ONLY. X1.TN1= 40 ;$ | | #1. / X1.TN0= 20 ;$ TAPE TRACK #0. / X1.IPO= 40 ;% INVALID POSTAMBLE ;%% NOT USED - TK25, TSV05. X1.IED= 20 ;* INVALID END DATA X1.POS= 10 ;* POSTAMBLE SHORT X1.EW= 10 ;* TK25 - EARLY WARNING. X1.POL= 4 ;* POSTAMBLE LONG ;** NOT USED - TK25, TSV05, TU80. X1.UNC= 2 ;UNCORRECTABLE DATA X1.MTE= 1 ;% MULTI-TRACK ERROR ;%% NOT USED - TSV05, TK25. ; ; XST2 BIT DEFENITIONS ; X2.OPM= 100000 ;OPERATION IN PROGRESS X2.SIP= 40000 ;* TS11-SILO PAR ERR, X2.RCE= 40000 ;* TSV05 - RAM CHECKSUM ERR, X2.DCF= 40000 ;* TK25 - COMMUNICATION FAULT. ;**NOT USED - TU80. X2.BPE= 20000 ;* SERIAL BUS PAR ERR AT DRIVE X2.DHF= 20000 ;* TK25 - HARDWARE FAULT. ;** NOT USED - TSV05, TU80. X2.SPD= 10000 ;* TK25 - CAPSTAN SPEED ERROR. ;** NOT USED - TSV05, TU80. X2.TU8= 4000 ;"1"-TU80 IDENTIFICATION. X2.TK2= 1000 ;"TK25" IDENTIFICATION. ; UNIT BIT 9, 11 ; TS11 0 0 UNIBUS ; TSV05 0 0 Q BUS ; TU80 0 1 UNIBUS ; TK25 1 0 Q22/UNIBUS ; TSU05 1 1 TSV05 FOR UNIBUS X2.WCF= 2000 ;* WRITE CARD FAILURE ;* NOT USED - TK25. X2.DTK= 777 ;* TS11/TU80 DATA TRFR: DEAD TRKS P,7-0. ;* TS11/TU80 WRT CHAR: MICROCODE REV. ;* TS11 STATUS: RES CAPSTAN TIC COUNT. ;* TU80 STATUS: 0'S. X2.REV= 377 ;* TSV05 WRT CHAR: 200 - XND FTR SW, ;* 100 - BUFF SW, 77 - MICROCODE REV. ;* TSV05 DATA TRF/STATUS: 0'S. X2.EAD= 377 ;* TK25 - ERROR ADDRESS (LO BYTE). X2.XFS= 200 ;* TK25 - WRT CHAR: XTND FEATURE SW, X2.MCD= 177 ; MICROCODE REV. ; ; XST3 BIT DEFENITIONS ; X3.MEC= 177400 ;TS11/TSV05/TU80 MICRO-DIAG ERROR CODE. X3.EAD= 177400 ;TK25 - ERROR ADDRESS (HI BYTE). X3.LMX= 200 ;* TAPE LIMIT EXCEEDED. ;** NOT USED - TK25/TSV05/TU80. X3.OPI= 100 ;OPERATION INCOMPLETE X3.REV= 40 ;TAPE MOVED BACKWARDS. X3.CRF= 20 ;* CAPSTAN RESPONSE FAILURE. X3.TCH= 20 ;* TK25 - NO TACHOMETER INDICATION. ;** NOT USED - TSV05, TU80. X3.DCK= 10 ;TS11/TSV05/TU80 - DENSITY CHECK. X3.STP= 10 ;TK25 - SERVO STRIPE FAILURE. X3.NOI= 4 ;* NOISE - COULD NOT ERASE. X3.LXS= 2 ;* REACHED TAPE LIMITS. ;** NOT USED - TK25, TSV05, TU80. X3.RIB= 1 ;REVERSE INTO BOT .PAGE ; ; TSSR BIT DEFINITIONS ; SR.SC= 100000 ;SPECIAL CONDITION SR.UPE= 40000 ;* UNIBUS PARITY ERROR SR.SPE= 20000 ;* SERIAL BUS PARITY ERROR ;* NOT USED - TK25/TSV05/TU80. SR.RMR= 10000 ;REGISTER MODIFICATION REFUSED SR.NXM= 4000 ;NON-EXISTENT MEMORY SR.NBA= 2000 ;NEED BUFFER ADDRESS SR.A17= 1000 ;BA 17 SR.A16= 400 ;BA 16 SR.SSR= 200 ;SUB-SYSTEM READY SR.OFL= 100 ;DEVICE IS OFF LINE SR.FC1= 40 ;* FATAL ERROR CLASS BIT 1 SR.FC0= 20 ;* FATAL ERROR CLASS BIT 0 ;* NOT USED - TK25. SR.TC2= 10 ;TERMINATION CLASS BIT 2 SR.TC1= 4 ;TERMINATION CLASS BIT 1 SR.TC0= 2 ;TERMINATION CLASS BIT 0 SR.TCN= SR.TC2!SR.TC1!SR.TC0 ;TERMINATION CLASS NUMBER. ; ; TSDBX REGISTER - BYTE REGISTER AT THE TSSR HIGH BYTE; Q22 BUS ONLY. ; DBX.BT= 20 ;BOOT TAPE - TSDBX DBX.BT '1' AND TSSR SSR '1': ; REWINDS THE TAPE TO BOT, SKIPS THE FIRST TAPE ; RECORD AND READS THE FIRST 512. BYTES OF THE ; SECOND TAPE RECORD TO MEMORY STARTING AT LOCATION 0. ; TSSR SSR REMAINS CLEARED UNTIL THE BOOT ; SEQUENCE HAS COMPLETED OR A DEVICE ERROR OCCURS. .PAGE ; ; COMMAND PACKET HEADER WORD - BIT DEFENITION ; CM.ACK= 100000 ;ACKNOWLEDGE BIT CM.CVC= 40000 ;CLEAR VOLUME CHECK CM.OPP= 20000 ;OPPOSITE BIT CM.SWB= 10000 ;SWAP BYTES CM.MOD= 7400 ;COMMAND MODE BITS CM.RTY= 1000 ;RETRY MODE BIT. CM.RVS= 400 ;REVERSE DIRECTION MODE BIT. CM.IE= 200 ;INTERRUPT ENABLE CM.COD= 37 ;COMMAND CODE BITS CM.LOW= 3 ;LOW HALF OF CODE BITS. CM.NML= CM.IE!CM.ACK ;NORMAL COMBO. OF FLAGS. ; ; COMMAND PACKET HEADER WORD ; CC.RDN= 0001!CM.NML ;READ NEXT (FORWARD) CC.RDP= 0401!CM.NML ;READ PREVIOUS (REVERSE) CC.RRP= 1001!CM.NML ;REREAD PREVIOUS (SPACE REV,READ FWD) CC.RRN= 1401!CM.NML ;REREAD NEXT (SPACE FWD, READ REV) CC.WRC= 0004!CM.NML ;WRITE CHARACTERISTICS CC.WRD= 0005!CM.NML ;WRITE DATA CC.WDR= 1005!CM.NML ;* WRITE RETRY (BCKSPC, ERASE, RE-WRITE) CC.WSM= 0006!CM.NML ;WRITE SUBSYSTEM MEMORY CC.SRF= 0010!CM.NML ;SPACE RECORDS FORWARD CC.SRR= 0410!CM.NML ;SPACE RECORDS REVERSE CC.STF= 1010!CM.NML ;SKIP TAPE MARKS FORWARD CC.STR= 1410!CM.NML ;SKIP TAPE MARKS REVERSE CC.RWD= 2010!CM.NML!CM.CVC ;REWIND CC.WTM= 0011!CM.NML ;WRITE TAPE MARK CC.ERS= 0411!CM.NML ;ERASE CC.WTR= 1011!CM.NML ;- WTMK RETRY (BCKSPC, ERASE, RE-WTMK) CC.UNL= 0412!CM.NML!CM.CVC ;REWIND AND UNLOAD CC.DRI= 0013!CM.NML ;DRIVE INITIALIZE CC.GST= 0017!CM.NML ;GET STATUS IMMEDIATE CC.MST=CC.GST!CM.CVC ;MOUNT & SET CHARACTERISTICS .PAGE ; ; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER) ; CSTAT: .BLKW T$$S11 ;CONTROLLER STATUS WORD CMDPTR: .BLKW T$$S11 ; > COMMAND PACKET. INTADD: .BLKW T$$S11 ; > I/O INTERRUPT SERVICING. SSRRTY: .BLKW T$$S11 ; > I/O RESUMPTION - SUBSYSTEM READY. TMOCNT: .BLKW T$$S11 ;SAVED I/O TIMEOUT, (UNIT OFFLINE) RTYINT: .BLKW T$$S11 ;SAVED INTADD(R3), CMDSAV: .BLKW T$$S11 ;SAVED COMMAND - WHILE REQUESTING STATUS. RTTBL: .BLKW T$$S11 ;RTRY CNT: +0-RTRYS LEFT, +1-TOTAL RTRYS RCVCNT: .BLKW T$$S11 ;RECOVERY COUNT - RECOVERY RTRYS (LEFT) ;CLEAN TAPE - PARAMETER SAVE AREA: CMDPK1: .BLKW T$$S11 ;CMD PKT WRD #1, CMDPK2: .BLKW T$$S11 ;CMD PKT WRD #2, CLNRTN: .BLKW T$$S11 ;RCVRY INTRPT @. CLNCNT= SPCNT ;TAPE CLN CNT - INIT REV/FWD SPC CNT. CLNED= SPACED ;CURRENT (CLEAN) BLOCK SPACE COUNT. SPCNT: .BLKW T$$S11 ;SPACING COUNT. SPACED: .BLKW T$$S11 ;SPACED (VIA TMK) COUNT. PRVDIR: .BLKW T$$S11 ;LO BYTE - PREV TAPE DIR:EQ/FWD,NEQ/REV. ;HI BYTE - TAPE DIR (WRT,WTMK,RD):EQ/FWD,NEQ/REV DEVTYP: .BLKW T$$S11 ;LO BYTE - NE IF TK25, ;HI BYTE - NE IF TSV05/TSU05. WRTOVR= 32. ; REWRITE WRITE/WTMK UP TO 64 TIMES ; FOR MAX EXTENDED IBG UP TO 20 FT. RDOVR= 40. ; REREAD UP TO 40 TIMES - REREAD= 8. ; CLEAN TAPE AFTER 8 REREADS. RDTMO= 12. ; READ TIMEOUT - 12. SEC. CLNTMO= 2 ; CLEAN TAPE SUBCYCLE TIME - 2 SEC. CLNCYC= 15. ; CLEAN TAPE - UP TO 15 SUBCYCLES. VC$MS = 0 ; Vectored MS driver. .PAGE ; EXECUTIVE VECTOR AREA EXEVEC: .WORD 0 ; IF NE - vectors already filled in. DVERR: .WORD $DVERR ; Vectored DVMSG: .WORD $DVMSG ; Exec FORK: .WORD $FORK ; references GTPKT: .WORD $GTPKT ; HFMSK: .WORD $HFMSK ; IOALT: .WORD $IOALT ; (filled EIODON: .WORD $IODON ; in by SCMOF: .WORD $SCMOF ; MSDRV CRPAS: .WORD $CRPAS ; code DVTMO: .WORD $DVTMO ; at MSKRB) MPUBM: .WORD $MPUBM ; STMAP: .WORD $STMAP ; FMSK2: .WORD $FMSK2 ; SFRK: .WORD S.FRK ; SPKT: .WORD S.PKT ; SCTM: .WORD S.CTM ; SITM: .WORD S.ITM ; SSTS: .WORD S.STS ; SST2: .WORD S.ST2 ; SKRB: .WORD S.KRB ; EXEVCL=<<<.-EXEVEC>/2>-1> ; Driver SCB reference patch table. ; ; The driver uses this patch table when it is called for the first ; controller on-line request. The driver initially contains SCB ; offset references of the form S.Vzzz located at Rzzzx. ; The contents of these references are replaced at driver assembly ; time with the value -1 (promote crashes if the vectoring isn't complete). S.VCSR = 177777 S.VOWN = 177777 S.VFRK = 177777 S.VPKT = 177777 S.VCTM = 177777 S.VITM = 177777 S.VSTS = 177777 S.VST2 = 177777 S.VKRB = 177777 K.VOWN = 177777 K.VCON = 177777 ; After the driver is LOAded and called for the first controller ; on-line request, the driver replaces these SCB references with ; the vectored equivalents from the driver's Executive vector area. ; ; Example: ; ; Previous code: MOV S.ITM(R4),S.CTM(R4) ; ; Vectored code: MOV S.VITM(R4),S.VCTM(R4) ; RITMx=.-4 ; xth occurence of S.VITM and ; RCTMy=.-2 ; yth occurence of S.VCTM in this driver. ; ; For this vectored code, this table contains: ; .WORD RITMx,S.ITM ; .WORD RCTMy,S.CTM ; SCBPAT: .WORD RPTK1,SPKT .WORD RPKT2,SPKT .WORD RPKT3,SPKT .WORD RCTM1,SCTM .WORD RCTM2,SCTM .WORD RCTM3,SCTM .WORD RCTM4,SCTM .WORD RCTM5,SCTM .WORD RITM1,SITM .WORD RITM2,SITM .WORD RITM3,SITM .WORD RITM4,SITM .WORD RITM5,SITM .WORD RITM6,SITM .WORD RITM7,SITM .WORD RITM8,SITM .WORD RITM9,SITM .WORD RITM10,SITM .WORD RITM11,SITM .WORD RITM12,SITM .WORD RSTS1,SSTS .WORD RSTS2,SSTS .WORD RSTS3,SSTS .WORD RSTS4,SSTS .WORD RSTS5,SSTS .WORD RSTS6,SSTS .WORD RSTS7,SSTS .WORD RSTS8,SSTS .WORD RSTS9,SSTS .WORD RSTS10,SSTS .WORD RSTS11,SSTS .WORD RSTS12,SSTS .WORD RST21,SST2 .WORD RKRB1,SKRB .WORD 0 ; Patch table terminator. .PAGE ; ; DRIVER DISPATCH TABLE ; DDT$ MS,T$$S11,,,,NEW ;Generate driver dispatch table. ; ; TERMINATION CODE DISPATCH TABLE ; ERJTBL: .IRPC X,<01234567> .WORD TCL'X'ER .ENDM ; ; VALID FUNCTION TABLE ; .MACRO FUNCT FCN, HCC, EXT, TMO, INT, ADR .WORD IO.'FCN ;QIO REQUEST. .WORD CC.'HCC ;HARDWARE COMMAND. .BYTE EXT ;I/O TIMEOUT ITERATIONS. .BYTE TMO ;I/O TIMEOUT - SECONDS. .WORD I'INT ;REQUEST INTERRUPT ENDUP ROUTINE. .WORD P'ADR ;REQUEST PRE-PROCESSING ROUTINE. .ENDM FUNCT VFTBL: FUNCT RLB,RDN,1,RDTMO,OCOM,READ ;READ FORWARD FUNCT WLB,WRD,1,12.,OCOM,WRITE ;WRITE LOGICAL BLOCK FUNCT RLV,RDP,1,RDTMO,OCOM,READ ;READ REVERSE FUNCT EOF,WTM, 1,4,ODON,WRTMK ;WRITE TAPE MARK FUNCT RWD,RWD,255.,2,RWDU,REWND ; REWIND FUNCT RWU,UNL, 1,2,RWDU,UNLOD ;REWIND AND UNLOAD FUNCT SPB,SRF,250.,6,SPCB,SPACE ; SPACE BLOCKS FUNCT SPF,STF,250.,6,SPCF,SPACE ; SPACE FILES FUNCT STC,MST,2.,2.,STAT,SET ;SET CHARACTERISTICS FUNCT SEC,GST,2.,2.,STAT,GSTAT ;SENSE CHARACTERISTICS FUNCT SMO,MST,2.,2.,MOUNT,SET ;MOUNT/SET CHARACTERISTICS FUNCT ERS,ERS,1,12.,ODON,WRTMK ;ERASE TAPE EVFTBL: ; ; MESSAGE HEADER TABLE ; MESSAG: .IRP X, .WORD MC.'X .ENDM .PAGE ;+ ; **-MSINI- INITIATE MAG TAPE I/O OPERATION ; ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O ; REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO ; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER ; IS NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O ; REQUEST. ELSE A RETURN TO THE CALLER IS EXECUTED. IF THE ; DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPERATION IS ; INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED. ; ; INPUTS: ; ; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; OUTPUTS: ; ; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST ; IS WAITING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED ; AND THE I/O OPERATION IS INITIATED. ;- ;+ ; THE FOLLOWING REGISTERS ARE RETURNED BY THE GTPKT$ MACRO: ; ; R1=ADDRESS OF THE I/O REQUEST PACKET ; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB ; R3=CONTROLLER INDEX ; R4=ADDRESS OF THE STATUS CONTROL BLOCK ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED ; ; I/O REQUEST PACKET FORMAT: ; ;I.LNK WD. 00 = I/O QUEUE THREAD WORD. ;I.PRI WD. 01 = REQUEST PRIORITY (LOW BYTE). ;I.EFN WD. 01 = EVENT FLAG NUMBER (HIGH BYTE). ;I.TCB WD. 02 = ADDRESS OF THE TCB OF THE REQUESTOR TASK. ;I.LN2 WD. 03 = POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER. ;I.UCB WD. 04 = CONTENTS OF 1ST LUN WORD IN REQUESTOR TASK HEADER (UCB) ;I.FCN WD. 05 = I/O FUNCTION CODE (IO.RLB/IO.RWD/IO.SPB/ETC.). ;I.IOSB WD. 06 = VIRTUAL ADDRESS OF I/O STATUS BLOCK. ;IOSB+2 WD. 07 = RELOCATION BIAS OF I/O STATUS BLOCK. ;IOSB+4 WD. 10 = I/O STATUS BLOCK ADDRESS (DISPLACEMENT+140000). ;I.AST WD. 11 = VIRTUAL ADDRESS OF AST SERVICE ROUTINE. ; ; ; READ/WRITE LOGICAL FUNCTION DEPENDENT I/O PACKET FORMAT: ; ;I.PRM WD. 12 = HIGH 2 BITS (BITS 4 & 5) OF 18 BIT DATA BUFFER ADDRESS. ;PRM+2 WD. 13 = LOW 16 BITS OF 18 BIT DATA BUFFER ADDRESS. ;PRM+4 WD. 14 = NUMBER OF BYTES TO BE TRANSFERRED. ;PRM+6 WD. 15 = NOT USED. ;PRM+10 WD. 16 = NOT USED. ;PRM+12 WD. 17 = NOT USED. ;PRM+14 WD. 20 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS. ;PRM+16 WD. 21 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000). ; ; ; BLOCK AND FILE SPACING FUNCTIONS DEPENDENT I/O PACKET FORMAT: ; ;I.PRM WD. 12 = SPACING COUNT (POSITIVE=FORWARD, NEGATIVE=BACKWARD). ;PRM+2 WD. 13 = NOT USED. ;PRM+4 WD. 14 = NOT USED. ;PRM+6 WD. 15 = NOT USED. ;PRM+10 WD. 16 = NOT USED. ;PRM+12 WD. 17 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS. ;PRM+14 WD. 20 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000). ;PRM+16 WD. 21 = NOT USED. ; ; (MOUNT AND) SET CHARACTERISTICS FUNCTION DEPENDENT I/O PACKET FORMAT. ; FOR SENSE CHARACTERISTICS, I.PRM (WD. 12) IS NOT USED: ; ;I.PRM WD. 12 = NEW CHARACTERISTICS WORD. ;PRM+2 WD. 13 = NOT USED. ;PRM+4 WD. 14 = NOT USED. ;PRM+6 WD. 15 = NOT USED. ;PRM+10 WD. 16 = NOT USED. ;PRM+12 WD. 17 = NOT USED. ;PRM+14 WD. 20 = NOT USED. ;PRM+16 WD. 21 = NOT USED. ; ; WREOF, REWIND, AND UNLOAD FUNCTIONS DEPENDENT I/O PACKET FORMAT: ; ;I.PRM WD. 12 = NOT USED. ;PRM+2 WD. 13 = NOT USED. ;PRM+4 WD. 14 = NOT USED. ;PRM+6 WD. 15 = NOT USED. ;PRM+10 WD. 16 = NOT USED. ;PRM+12 WD. 17 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS. ;PRM+14 WD. 20 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000). ;PRM+16 WD. 21 = NOT USED. ;- MSINI: GTPKT$ MS,T$$S11 ;GET NEXT I/O PACKET TO PROCESS CLR CSTAT(R3) ;CLEAR CONTROLLER FLAGS CLR RCVCNT(R3) ;NOT IN ERROR RECOVERY. CLRB PRVDIR+1(R3) ;ASSUME FWD DIRECTION. CLR R0 ;LABELLED BITB #US.LAB,U.STS(R5) ; TAPE? BNE 20$ ;IF NE, YES. BIS #CH.ESS!CH.ENB,R0 ;STOP TMK/TMK .OR. BOT/TMK. 20$: MOV CMDPTR(R3),R2 ;CMDPTR SETUP? BEQ GCR ;IF EQ, NO. CMP R0,CHRWD4(R2) ;CHAR PCKT PER REQUEST? BNE GCR ;IF NE, CHANGE CHARACTERISTICS. 30$: BIT #SR.NBA,@S.CSR(R4) ;COMMUNICATING WITH TAPE SYSTEM? BNE GCR ;IF NE, NO. ILDBA: MOV S.VPKT(R4),R1 ;RELOAD PACKET POINTER. RPTK1=.-2 MOV #VFTBL,R2 ;POINT AT VALID FUNCTIONS TABLE MOV I.FCN(R1),R0 ;GET FUNCTION CODE FROM PACKET BIT #IQ.X,R0 ;ERROR RECOVERY PROHIBITED? BEQ 50$ ;IF EQ NO BIS #CS.NER,CSTAT(R3) ;CORRESPONDING FLAG BIC #IQ.X,R0 ;AND CLEAR BIT FOR COMPARE. 50$: BITB #IQ.UMD,R0 ;DIAGNOSTIC FUNCTION CALL? BEQ 60$ ;IF EQ NO BIS #CS.UMD,CSTAT(R3) ;COPY DIAGNOSTIC FLAG BIC #IQ.UMD,R0 ;CLEAR BIT FOR FUNCTION CHECK 60$: CMP R0,(R2)+ ;FUNCTION CODES MATCH? BEQ 70$ ;IF EQ YES ADD #10,R2 ;POINT TO NEXT TABLE ENTRY CMP #EVFTBL,R2 ;END OF TABLE? BNE 60$ ;IF NE NO MOV #IE.IFC&377,R0 ;SET UP ILLEGAL FUNCTION CODE BR ALT ;GO TO EXIT 70$: MOV (R2)+,R1 ;R1 - I/O COMMAND CODE. MOVB (R2)+,S.VSTS(R4) ;SET EXTENDED TIMEOUT VALUE RSTS1=.-2 MOVB (R2)+,S.VITM(R4) ;SET INITIAL TIMEOUT VALUE RITM1=.-2 MOV (R2)+,INTADD(R3);STORE INTERRUPT ADDRESS CALLR @(R2) ;GO TO PRE-PROCESSING FOR THIS FUNCTION ;+ ; **-GCR-GENERATE CHARACTERISTICS ROUTINE ; ; SETUP HARDWARE/SOFTWARE COMMUNICATIONS .OR. ; MODIFY DEVICE LEOV DETECTION CHARACTERISTICS. ;- GCR: MOVB #2,S.VITM(R4) ;SET TIMEOUT RITM2=.-2 BIS #CS.LBA,CSTAT(R3) ;SET WRITE CHAR FLAG MOV R5,R1 ;R1 > ADD #U.VCB+4,R1 ; DEVICE PKT AREA BIC #3,R1 ; ON MOD4 BOUNDARY. CMP R1,R2 ;PKT AREA SETUP? BEQ 10$ ;IF EQ, YES. MOV R1,R2 ;R2 > MOV R1,CMDPTR(R3) ; PKT AREA. 10$: ADD #MSGHDR,R1 ;R1 > MSG PKT. ; SETUP CHARACTERISTIC PACKET CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA. MOV R1,-(SP) ;PUSH ADDRESS TO TRANSLATE CALL TRPHYS ;TRANSLATE TO PHYSICAL (IF NEEDED) MOV (SP)+,CHRWD1(R2) ;STORE CHARACTERISTICS PACKET ADDRESS MOV (SP)+,CHRWD2(R2) ; AND HI-ORD ADDRESS. MOV #14.,CHRWD3(R2) ;MSG BUF - 14. WRDS, MOV R0,CHRWD4(R2) ;DEVICE CHAR. ADD #CHRWD1-MSGHDR,R1 ;R1 > CHAR PKT. ; SETUP COMMAND PACKET MOV #CC.WRC,CMDHDR(R2) ;WRITE CHAR, CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA. MOV R1,-(SP) ;PUSH ADDRESS TO TRANSLATE CALL TRPHYS ;TRANSLATE TO PHYSICAL (IF NEEDED) MOV (SP)+,CMDB2(R2) ;STORE CHARACTERISTICS PACKET ADDRESS MOV (SP)+,CMDB3(R2) ; AND HI-ORD ADDRESS. MOV #10,CMDB4(R2) ;4 WORD TRFR. JMP INITIO ;START I/O .PAGE ;+ ; PRE-PROCESSING ROUTINES FOR I/O OPERATIONS ; ; INPUTS: ; R1 = HARDWARE FUNCTION CODE ; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS ; R5 = UCB ADDRESS ;- .ENABL LSB ; ; WRITE DATA ; PWRITE: CMP U.CNT(R5),#14. ;ENOUGH BYTES FOR WRITE? BHIS 75$ ;IF HIS YES TST U.CNT(R5) ;IS IT MAX COUNT? BEQ 75$ ;IF EQ YES MOV #IE.SPC&377,R0 ;SET UP PARAMETER ERROR CODE BR ALT ;GO TO EXIT ; ; WRITE TAPE MARK ; PWRTMK: CLR U.CNT(R5) ;INSURE COUNT IS 0 75$: MOV #WRTOVR*2,RTTBL(R3) ;SETUP ERROR RECOVERY MOVB RTTBL(R3),RTTBL+1(R3) ; RETRY COUNT. BIT #M.SWL,U.CW2(R5) ;(USER) DISABLED WRITING? BEQ PIOCOM ;IF EQ NO MOV #IE.WLK&377,R0 ;SET UP WRITE LOCK ERROR CODE BR ALT ;GO TO EXIT ; ; READ FWD/REV ; PRDREV: INCB PRVDIR+1(R3) ;REVERSE DIRECTION. PREAD: MOV #RDOVR,RTTBL(R3) ;SETUP ERROR RECOVERY MOVB RTTBL(R3),RTTBL+1(R3) ; RETRY COUNT. BR PIOCOM ; . . CONT. ; ; SPACE BLOCKS AND SPACE FILES ; PSPACE: MOV #IS.SUC&377,R0 ;ASSUME 0 SPACING COUNT MOV U.BUF(R5),U.CNT(R5) ;PUT SPACING COUNT IN PLACE MOV U.BUF(R5),SPCNT(R3) ;REMEMBER SPACING COUNT. BEQ ALT ;IF EQ NO I/O NEEDED (U.BUF=0) BMI 90$ ;IF MI SPACE REVERSE (U.BUF=NEGATIVE) BIT #M.AEOV,U.CW2(R5) ;AT EOV? BEQ 80$ ;IF EQ, NO. MOV #IE.EOV&377,R0 ;SET UP END OF VOLUME CODE ALT: CALL @IOALT ;TERMINATE THIS REQUEST JMP MSINI ; AND SERVICE OTHER REQUESTS. 80$: BITB #US.LAB,U.STS(R5) ;SPACING LABELLED TAPE? BNE 100$ ;IF NE, YES. BIT #M.BOT,U.CW2(R5) ;SPACING FROM BOT? BNE 100$ ;IF NE, YES. CMP #CC.SRF,R1 ;SPACING RECORDS FWD? BEQ 100$ ;IF EQ, YES. MOV #^C<0>,U.CNT(R5) ;SETUP MAX BLK SPACING COUNT, CLR SPACED(R3) ; NO TMKS SPACED YET AND BIC #CC.STF-CC.SRF,R1 ; SPACING VIA BLOCKS. BIS #CS.SFB,CSTAT(R3) ;SPACING FILES VIA SPACE BLOCKS. BR 100$ 90$: BIS #CC.SRR-CC.SRF,R1 ;MAKE CMND SPACE/SKIP REVERSE NEG U.CNT(R5) ;MAKE COUNT POSITIVE 100$: BIS #CS.RSP,CSTAT(R3) ;SET "REWIND/SPACE IN PROGRESS" FLAG BR PIOCOM .DSABL LSB ; ; (MOUNT AND) SET CHARACTERISTICS, GET STATUS ; PSET: BIC #USRBTS,U.CW2(R5) ;CLEAR USER SETTABLE BITS BIC #^C,U.BUF(R5) ;REMOVE NON-SETABLE BITS. BIS U.BUF(R5),U.CW2(R5) ;UPDATE USER SETABLE BITS. ; ; GET STATUS (SENSE (MOUNT AND) SET CHARACTERISTICS) ; PGSTAT: BIS #CS.GST,CSTAT(R3) ;SET GET STATUS FLAG. BR PUNLOD ; . . CONT. ; ; REWIND TAPE ; PREWND: BIS #M.RWD,U.CW2(R5);SET TAPE REWINDING FLAG. BIS #CS.RSP,CSTAT(R3) ;SET "REWIND/SPACE IN PROGRESS" FLAG ; ; UNLOAD TAPE ; PUNLOD: CLR U.CNT(R5) ;INSURE COUNT IS 0 BR PIOCM1 ;PREPROCESS REQUEST. .PAGE ; ; I/O OPERATION COMMON PRE-PROCESSING ; PIOCOM: MOV #IE.ABO&377,R0 ;ABORT REQUEST? BITB #US.PWF,U.STS(R5) ;PWFLD INDICATOR SET? BNE ALT ;IF NE, YES. PIOCM1: MOV CMDPTR(R3),R2 ;R2 > COMMAND BUFFER. MOV R1,(R2)+ ;LOAD COMMAND HEADER IN BUFFER BIC #^C,R1 ;ISOLATE COMMAND CODE BITS CMP R1,#CC.GST&CM.COD ;SENSE REQUEST? BEQ 110$ ;IF EQ, YES. BIC #M.PEOV!M.AEOV,U.CW2(R5) ;M.PEOV/M.AEOV PER END STATUS. 110$: CMP R1,#CC.SRF&CM.COD ;FILL IN COMPLETE PACKET? BHIS 130$ ;IF HIS NO ; DATA TRANSFER REQUEST BIT #M.SWAP,U.CW2(R5) ;SWAP BYTES ON DATA? BEQ 120$ ;IF EQ NO BIS #CM.SWB,-2(R2) ;SET SWAP BITS BYTE IN HEADER WORD 120$: BIT #DV.EXT,U.CW1(R5) ;22 BIT Q BUS? BNE 125$ ;IF NE, YES. CALL @STMAP ;SET UP UNIBUS MAPPING MOV R2,-(SP) ;SAVE R2 CALL @MPUBM ;MAP UNIBUS TO TRANSFER MOV (SP)+,R2 ;RESTORE R2 125$: MOV U.BUF+2(R5),(R2)+ ;SET UP LO 16 ADDR BITS. BIT #DV.EXT,U.CW1(R5) ;22 BIT Q BUS? BEQ 127$ ;IF EQ, UNIBUS. MOVB U.BUF+1(R5),(R2)+ ;SET UP HI CLRB (R2)+ ; 6 ADDR BITS. BR 130$ ; . . CONT. 127$: MOV U.BUF(R5),(R2) ;SET UP HI 2 ADDR BITS ASR (R2) ;AND MOVE FROM ASR (R2) ;BITS 4 AND 5 ASR (R2) ;TO ASR (R2)+ ;BITS 0 AND 1 130$: MOV U.CNT(R5),(R2) ;LOAD BYTE/RECORD/FILE COUNT .PAGE ;+ ; INITIATE I/O OPERATION ; ; INPUTS: ; ; COMMAND PACKET SETUP. ; ; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS ; R5 = UCB ADDRESS ;- INITIO: MOVB S.VITM(R4),S.VCTM(R4) ;START THE TIMER RITM3=.-4 RCTM1=.-2 MTPS #PR5 ;INHIBIT INTERRUPTS MOV S.CSR(R4),R2 ;;;RETREIVE CSR ADDRESS TSTB (R2) ;;;SUBSYSTEM READY? BPL 140$ ;;;IF PL NO CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA. MOV CMDPTR(R3),-(SP) ;;;PUSH ADDRESS TO TRANSLATE CALL TRPHYS ;;;TRANSLATE TO PHYSICAL (IF NEEDED) MOV (SP)+,R1 ;;; SETUP CMD PKT PHYS @ BITS 15-2 BIS (SP)+,R1 ;;; AND BITS 17,16 IN R1. MOV R1,TSDB(R2) ;;; START I/O. BIS #CS.CIP,CSTAT(R3) ;;;SET COMMAND IN PROGRESS BR 150$ ;;;EXIT 140$: MOVB #4,S.VCTM(R4) ;;;SET TIMER RCTM2=.-2 BIS #CS.WSS,CSTAT(R3) ;;;SET WAITING FLAG MOV #INITIO,SSRRTY(R3) ;;;SET RETURN ADDRESS 150$: MTPS #0 ;;;ALLOW INTERRUPTS AND RETURN ;EXIT WHILE I/O IN PROGRESS. .PAGE ;+ ; **-MSCAN- CANCEL I/O ENTRY POINT ; ; ACTIVE I/O REQUESTS ARE MARKED FOR ABORT - ; THE I/O REQUEST WILL THEN END NORMALLY AS A RESULT OF INTERRUPT ; SERVICING .OR. END ABNORMALLY VIA THE TIMEOUT (MSOUT:) ROUTINE. ; ; INPUTS: ; R0 = ACTIVE I/O PACKET ADDRESS ; R1 = CURRENT TCB ADDRESS ; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS ; R5 = UCB ADDRESS ;- MSCAN: CMP I.TCB(R0),R1 ;;;IS THIS THE CORRECT TASK? BNE 10$ ;;;IF NE NO BIS #CS.ABO!CS.NER,CSTAT(R3) ;ABORT REQUEST - NO ERR RCVRY. 10$: RETURN ;;;RETURN ;+ ; **-MSPWF- POWERFAIL ENTRY POINT ; ; US.PWF SET TO DISALLOW NORMAL QIO REQUESTS EXCEPT FOR - ; IO.RWD, IO.RWU, IO.SMO, IO.SEC AND IO.STC. ; ; SUCCESSFUL IO.RWD, IO.RWU, IO.SMO RESET US.PWF AND ALLOW QIO REQUESTS. ; ; INPUTS: ; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS ; R5 = UCB ADDRESS ;- MSPWF: BCS 10$ ;IF CS, CONTROLLER POWER FAIL. BISB #US.PWF,U.STS(R5) ; ELSE, UNIT POWER FAIL ; DISALLOW NORMAL QIO'S. BIT #HF.UBM,@HFMSK ;UMRS? BNE 10$ ;IF NE - MAPPED @. BIS #DV.EXT,U.CW1(R5) ;ELSE - PHYSICAL @. 10$: RETURN .PAGE ;+ ; **-MSOUT- TIMEOUT ENTRY POINT ; ; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING TERMINATED. ; IF THE OPERATION WAS DIAGNOSTIC, THE QIO REQUEST IS TERMINATED. ; TIMEOUTS ARE USUALLY CAUSED BY POWER FAILURE BUT MAY ALSO BE THE ; RESULT OF HARDWARE CONSIDERATIONS. IN PARTICULAR, A LENGTHY ; SPACING OPERATION OR A REWIND ON THIS MODEL TAPE DRIVE MAY ; RESULT IN A TIMEOUT WHICH WILL BE IGNORED. ; ; INPUTS: ; R0 = LITERAL CONSTANT IE.DNR ; R2 = CSR ADDRESS ; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS ; R5 = UCB ADDRESS ;- .ENABL LSB MSOUT: BIT #CS.ABO,CSTAT(R3) ;;;BEEN TOLD TO ABORT? BNE 10$ ;;;IF NE YES - ABORT BIT #CS.SER,CSTAT(R3) ;;;'SEL ERR' - UNIT OFFLINE? BNE 10$ ;;;IF NE, YES. BIT #CS.WSS,CSTAT(R3) ;;;WAITING FOR SUB-SYSTEM READY? BNE 30$ ;;;IF NE YES BIT #CS.RSP,CSTAT(R3) ;;;REWIND/SPACE TIMEOUT? BNE 40$ ;;;IF NE YES BIS #CS.TMO,CSTAT(R3) ;;;FLAG TIMEOUT BEING LOGGED CALL MSDTER ;;;LOG DEVICE TIMEOUT 10$: MTPS #0 ;LOWER PRIORITY BIT #M.SER,U.CW2(R5);SELECT ERROR IN PROGRESS? BNE NORDY ;IF NE YES MSOUT1: CLR R1 ;CLEAR R1 CALLR IODON ;AND EXIT 30$: TSTB (R2) ;;;IS THE SUBSYSTEM READY? BPL 40$ ;;;IF PL NO INCB S.VSTS(R4) ;;;INSURE CONTROLLER IS BUSY RSTS2=.-2 BIC #CS.WSS,CSTAT(R3) ;;;CLEAR WAITING FLAG MTPS #0 ;;;LOWER PRIORITY CALLR @SSRRTY(R3) ;RETRY OPERATION 40$: DECB S.VSTS(R4) ;;;SUBSYSTEM RECOVERY TIMED OUT? RSTS3=.-2 BEQ 10$ ;;;IF EQ YES, RETURN WITH DRIVE NOT READY MOVB S.VITM(R4),S.VCTM(R4) ;;;START TIMER RITM4=.-4 RCTM3=.-2 RETURN .DSABL LSB .PAGE ;+ ; **-NORDY-TAPE UNIT NOT READY ; ; ISSUE 'SEL ERR' MESSAGES AT 15 SEC INTERVALS FOR OFFLINE UNITS ; .OR. END THE REQUEST FOR USER CONTROL PARAMETERS OR ACP. ; ; INPUTS: R3 - CNTRL INDX, R4 > SCB, R5 > UCB. ;- NORDY: BIT #CS.NER!CS.UMD!CS.ABO,CSTAT(R3) ;USER CNTRL PARAMETERS? BNE 10$ ;IF NE, YES. TST U.ACP(R5) ;ACP REQUEST? BEQ 20$ ;IF EQ, NO. 10$: MOV RTYINT(R3),INTADD(R3) ;INTADD PER REQUEST, MOV #IE.DNR&377,R0 ; DRIVE NOT READY JMP IODON ; AND END REQUEST. 20$: CMP #NORD1,INTADD(R3) ;M.SER FIRST TIME? BEQ NORDY0 ;IF EQ, NO. ;SAVE CMD HDR WRD .AND. SETUP FOR SENSE REQUEST. MOV CMDPTR(R3),R2 ;R2 > CMD PKT. MOV (R2),CMDSAV(R3) ;SAVE CMD PKT HDR WRD AND MOV #CC.GST,(R2) ; SETUP CMD PKT FOR SENSE RQST. MOVB S.VITM(R4),TMOCNT(R3) ;SAVE REQUEST TIMEOUT RITM5=.-4 MOVB S.VSTS(R4),TMOCNT+1(R3) ; AND TIMEOUT ITERATION COUNT. RSTS4=.-4 MOVB #2,S.VITM(R4) ;SETUP SENSE I/O TIMEOUT. RITM6=.-2 MOVB #1,S.VSTS(R4) ;FAKE END OF 15 SEC CYCLE. RSTS5=.-2 MOV INTADD(R3),RTYINT(R3) ;SAVE REQUEST ENDUP ADDR AND MOV #NORD1,INTADD(R3) ; AND RETURN HERE AFTER SNS RQST. BIS #CS.SER,CSTAT(R3) ;'SEL ERR' - UNIT OFFLINE. TIME: DECB S.VSTS(R4) ;END OF 15 SEC? RSTS6=.-2 BNE TIMER ;IF NE, NO. MOV #T.NDSE,R0 ;R0='SEL ERR' MSG CODE CALL @DVMSG ; AND ISSUE 'SEL ERR' MESSAGE. MOVB #15.,S.VSTS(R4) ;15 SEC 'SEL ERR' TIMEOUT RSTS7=.-2 TIMER: MOVB #1,S.VCTM(R4) ; CHECKED AT 1 SEC INTERVALS.V RCTM4=.-2 RETURN ; RETURN FROM **-NORDY SENSE REQUEST INTRPT SERVICING ; ; INPUTS: R2 > CMD PKT, R3 - CNTRL INDX, R4 > SCB, R5 > UCB. NORD1: BIT #M.SER,U.CW2(R5) ;OFFLINE? BNE TIME ;IF NE, YES. ; ONLINE - SETUP CMD PKT AND ISSUE I/O REQUEST. BIC #CS.SER,CSTAT(R3) ;NOT OFFLINE STATE. MOV CMDSAV(R3),(R2) ;RESTORE CMD PKT HDR WRD, MOV RTYINT(R3),INTADD(R3) ; INTERRUPT SERVICE ADDR, MOVB TMOCNT(R3),S.VITM(R4) ; TIMEOUT COUNT AND RITM7=.-2 MOVB TMOCNT+1(R3),S.VSTS(R4) ; TIMEOUT ITERATION COUNT. RSTS8=.-2 NORDY0: JMP INITIO ;GET STS .OR. RE-ISSUE I/O RQST. .PAGE ;+ ; **-$MSINT- SERVICE DEVICE INTERRUPTS. ;- INTSE$ MS,PR5,T$$S11 ;;;SAVE REGISTERS & SET PRIORITY BIT #CS.CIP,CSTAT(R4) ;;;COMMAND IN PROGRESS? BNE 5$ ;;;IF NE YES RETURN ;;;NO, IGNORE INTERRUPT 5$: CALL @FORK ;;;CREATE A SYSTEM PROCESS MOV R4,R3 ;COPY CONTROLLER INDEX MOV U.SCB(R5),R4 ;PICK UP SCB ADDRESS MOV CMDPTR(R3),R2 ;R2 > CMD PCKT. MOV @S.CSR(R4),TSSRSV(R2) ;SAVE DEVICE STATUS. MOV TSSRSV(R2),R1 ;R1 - DEVICE STATUS. MOV (R2),-(SP) ;(SP) - BIC #^C,(SP) ; COMMAND CODE. ;STATUS/WRITE CHAR DON'T RETAIN PREVIOUS TAPE MARK INDICATION. CMP (SP),#CC.GST&CM.COD ;SENSE REQUEST? BEQ 15$ ;IF EQ, YES. CMP (SP),#CC.WRC&CM.COD ;WRITE CHAR REQUEST? BEQ 15$ ;IF EQ, YES. BITB #US.LAB,U.STS(R5) ;(NO LEOV FOR) LABELLED TAPE? BNE 8$ ;IF NE, YES. BIT #X3.REV,XST3(R2) ;(NO LEOV FOR) TAPE MOVED REV? BNE 8$ ;IF NE, YES. BIT #X0.LET,XST0(R2) ;HARDWARE DETECT LEOT? BNE 7$ ;IF NE, YES. BIT #M.BOT!M.TMK,U.CW2(R5) ;BOT .OR. TMK PREV I/O? BEQ 8$ ;IF EQ, NO. ;PEOV IF PREV BOT/TMK .OR. TMK/TMK WITHOUT INTERVENING BLKS. BIT #X0.TMK,XST0(R2) ;TMK THIS I/O? BEQ 8$ ;IF EQ, NO. CMP (SP),#CC.RDN&CM.COD ;READ FWD? BNE 6$ ;IF NE, NO. CMP RBPCR(R2),CMDB4(R2) ;DATA ON READ? BEQ 117$ ;IF EQ, NO - TMK/TMK. 6$: CMP (SP),#CC.SRF&CM.COD ;SPACING FWD? BNE 8$ ;IF NE, NO. MOV CMDB2(R2),R0 ;R0 - DEC R0 ; I/O SPACE COUNT-1. CMP RBPCR(R2),R0 ;SPACED OVER TMK, NO DATA? BNE 8$ ;IF NE, NO. 117$: TSTB PRVDIR(R3) ;TAPE PREVIOUS DIRECTION? BNE 8$ ;IF NE, REVERSE. 7$: BIS #M.PEOV,U.CW2(R5) ;TAPE PAST LEOV BR 9$ ; AND TMK INDICATION. 8$: BIT #M.PEOV,U.CW2(R5) ;PREVIOUS PEOV? BNE 10$ ;IF NE, YES. BIC #M.TMK,U.CW2(R5) ;ASSUME NOT TMK. MOV (R2),R0 ;R0 - BIT8:CMND MODE REV, BIC #CM.NML!^C<777>,R0 ;BIT7-5:PKT FMT, BIT4-0:CMD CODE CMP #410,R0 ;SPACE REVERSE REQUEST? BEQ 10$ ;IF EQ, YES - NO TMK INDICATION. BIT #X0.TMK,XST0(R2) ;TMK? BEQ 10$ ;IF EQ, NO. 9$: BIS #M.TMK,U.CW2(R5) ; ELSE, TMK. 10$: CLRB PRVDIR(R3) ;ASSUME TAPE FORWARD DIRECTION. BIT #X3.REV,XST3(R2) ;FORWARD DIRECTION? BEQ 15$ ;IF EQ, YES. INCB PRVDIR(R3) ; ELSE - REVERSE DIRECTION. 15$: TST (SP)+ ;MAINTAIN STACK. BIC #NEWBTS,U.CW2(R5) ;STATUS TO BE UPDATED. BIT #X0.PED,XST0(R2) ;1600 BPI MODE? BEQ 20$ ;IF EQ, NO. BIS #M.1600,U.CW2(R5) ; ELSE 1600 BPI (PE) MODE. 20$: BIT #X0.BOT,XST0(R2) ;BOT? BEQ 30$ ;IF EQ, NO. BIS #M.BOT,U.CW2(R5) ; ELSE BOT. 30$: BIT #X0.EOT,XST0(R2) ;EOT? BEQ 50$ ;IF EQ, NO. BIS #M.EOT,U.CW2(R5) ; ELSE EOT. 50$: BIT #X0.WLK,XST0(R2) ;WRITE LOCKED? BEQ 60$ ;IF EQ, NO. BIS #M.HWL,U.CW2(R5) ; ELSE WRITE LOCKED. 60$: BIT #SR.OFL,R1 ;ONLINE? BEQ 70$ ;IF EQ, YES. BIS #M.SER,U.CW2(R5) ; ELSE SEL ERR - OFFLINE. 70$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESS. BIC #^C,R1 ;R1 - TERMINATION CODE. CMPB MSGHDR(R2),MESSAG(R1) ;MESSAGE MATCH TERM CODE? BEQ 80$ ;IF EQ, YES. MOV #SR.TC2!SR.TC1,R1 ; ELSE TERM CODE = 6. 80$: JMP @ERJTBL(R1) ;SERVICE INTRPT PER TERM CODE. .PAGE ;+ ; SERVICE INTERRUPT PER TERMINATION CODE ; ; R0 - IS.SUC&377 R1 - TERM CODE R2 - > COMMAND PACKET ; R3 - CNTRLR INDX R4 - > SCB R5 - > UCB ;- ; TERMINATION CODE 0 - NORMAL TERMINATION TCL0ER: BIT #CS.LBA,CSTAT(R3) ;WRITTEN CHARACTERISTICS BEQ TCEXIT ;IF EQ NO, EXIT ; TERMINATION CODE 1 - ATTENTION CONDITION TCL1ER: BIC #CS.LBA,CSTAT(R3) ;CLEAR BUFFER ADDRESS FLAG CLR DEVTYP(R3) ;DETERMINE DEVICE TYPE. MOV XST2(R2),R1 ;R1 - XSTAT2. BIC #^C,R1 ;R1 - DEVICE IDENTIFIER. CMP #X2.TK2,R1 ;TK25? BNE 10$ ;IF NE, NO. INC DEVTYP(R3) ;DEVICE TYPE - TK25 MOVB #UD.8K,U.CW3+1(R5) ; AND UPDATE DENSITY SUPPORT. BR 30$ 10$: TST R1 ;TS11/TSV05 .OR. TU80/TSU05? BNE 20$ ;IF NE, TU80/TSU05. BIT #HF.UBM,@HFMSK ;UMRS? BNE 30$ ;IF NE, THEN TS11. BR 25$ ; .. CONT. 20$: CMP #X2.TU8,R1 ;TU80? BEQ 30$ ;IF EQ, YES. 25$: INCB DEVTYP+1(R3) ;DEVICE TYPE - TSV05/TSU05. 30$: JMP ILDBA ;PROCESS QIO REQUEST. ; TERMINATION CODE 2 - TAPE STATUS ALERT TCL2ER: BIT #M.EOT,U.CW2(R5) ;EOT? BEQ 10$ ;IF EQ NO CMPB #CC.WRD,(R2) ;WRITE DATA? BEQ 5$ ;IF EQ YES CMPB #CC.WTM,(R2) ;WTMK? BEQ 5$ ;IF EQ YES CMPB #CC.ERS,(R2) ;ERASE? BNE 10$ ;IF NE NO 5$: MOV #IE.EOT&377,R0 ;SET EOT FOR RETURN BR TCEXIT ;END REQUEST. 10$: BIT #X0.TMK,XST0(R2) ;TAPE MARK? BEQ 20$ ;IF EQ NO MOV #IE.EOF&377,R0 ;ENDING STATUS - EOF BR TCEXIT ; AND END REQUEST. 20$: BIT #X0.RLL,XST0(R2) ;RECORD LENGHT LONG? BEQ TCEXIT ;IF EQ NO MOV #IE.DAO&377,R0 ;SET RECORD LONG BR TCEXIT ;PROCESS COMPLETION ; TERMINATION CODE 3 - FUNCTION REJECT TCL3ER: BIT #CS.GST,CSTAT(R3) ;GET STATUS IN PROGRESS? BNE TCEXIT ;IF NE YES BIT #M.SER,U.CW2(R5) ;OFFLINE? BEQ 10$ ;IF EQ NO CALLR NORDY ;YES, HANDLE IT 10$: BIT #X0.VCK!X0.ILC!X0.ILA,XST0(R2) ;HARD ERROR? BNE FATAL ;IF NE YES FATAL BIT #M.HWL,U.CW2(R5) ;DEVICE WRITE LOCKED? BEQ TCEXIT ;IF EQ NO MOV #IE.WLK&377,R0 ;SET WRITE LOCK TCEXIT: JMP @INTADD(R3) ;GOTO REQUEST ENDUP. FATAL: JMP TCL6ER ;FATAL ERROR. .PAGE ; TERMINATION CODE 4 - RECOVERABLE ERROR: TAPE MOVED 1 BLOCK TCL4ER: TSTB DEVTYP(R3) ;TK25? BEQ 2$ ;IF EQ, NO. MOV (R2),R1 ;R1 - I/O BIC #^C<17>,R1 ; COMMAND CODE. CMP #5,R1 ;WRITE TO TAPE? BEQ 1$ ;IF EQ, YES. CMP #11,R1 ;WTMK OR ERASE TAPE? BNE 2$ ;IF NE, NO. 1$: BIT #X1.EW,XST1(R2) ;TK25 EW WRITE ERROR? BNE 3$ ;IF NE, YES - DON'T LOG IT. 2$: CALL MSDVER ;LOG THE DEVICE ERROR. 3$: BIT #CS.NER!CS.UMD,CSTAT(R3) ;ERR RECOVERY INHIBITED? BNE 30$ ;IF NE, YES - END REQUEST. MOV (R2),R0 ;RETRIEVE COMMAND HEADER WORD BIC #^C<6437>,R0 ;R0 - CMND MODE, CMND CODE. TST RCVCNT(R3) ;SETUP FOR ERROR RECOVERY? BNE 20$ ;IF NE, YES. CMPB #1,R0 ;READ? BEQ 10$ ;IF EQ, YES. CMPB #5,R0 ;WRITE? BEQ 5$ ;IF EQ, YES. CMPB #11,R0 ;WTMK? BNE FATAL ;IF NE, I/O NOT RETRIABLE. 5$: BIT #M.IWR,U.CW2(R5) ;(USER) INHIBIT XND GAPS? BNE 30$ ;IF NE, YES. 10$: BIS #CM.RTY,(R2) ;I/O REQUEST - RETRY COMMAND. MOV #REREAD,RCVCNT(R3) ;ASSUME READ RETRY. CMPB #1,R0 ;I/O= READ? BEQ 20$ ;IF EQ, YES. MOV #WRTOVR*2,RCVCNT(R3) ;ELSE, WRITE/WTMK. 20$: CMPB #1,R0 ;READ? BEQ 22$ ;IF EQ, YES. BIT #M.EOT,U.CW2(R5) ;EOT? BEQ 22$ ;IF EQ, NO. CMPB #WRTOVR,RTTBL(R3) ;RECOVERY - NGT 10 FT? BHIS 22$ ;IF HIS, NO. MOVB #WRTOVR,RTTBL(R3) ;ERR RCVRY - NGT 10 FT AFTER EOT. ;SETUP FOR ERROR RECOVERY. 22$: DECB RTTBL(R3) ;RETRY FURTHER? BEQ PARERR ;IF EQ, NO. 25$: DEC RCVCNT(R3) ;REISSUE I/O? BNE AGAIN ;IF NEQ, YES. CMPB #1,R0 ;READ? 30$: BNE PARERR ;IF NE, NO - END REQUEST. ;CLEAN TAPE ON READ. TSTB DEVTYP(R3) ;TK25? BNE AGAIN ;IF NE, NO TAPE CLEAN FOR TK25S. CLEAN: MOV INTADD(R3),CLNRTN(R3) ;RCVRY ISR RETURN, MOV #CLNISR,INTADD(R3) ;CLEAN ISR RETURN. MOV (R2),CMDPK1(R3) ;CMD PKT HDR WRD, MOV 2(R2),CMDPK2(R3) ; DATA TRFR LO BUF @. MOV #5,CLNCNT(R3) ;IF READ FWD, BCKSPC 5 BLOCKS. TSTB PRVDIR+1(R3) ;READ FWD REQUEST? BEQ 27$ ;IF EQ, YES. DEC CLNCNT(R3) ;READ REV - BCKSPC 4 BLKS, 27$: MOV #CC.SRR,(R2) ;TAPE CLEAN (BCKSPC OVER CLNR) CLNSET: MOV CLNCNT(R3),CMDB2(R2) ; AND SPACING COUNT. BEQ FWDPOS ; IF EQ, Repositioned for RD FWD. CLR CLNED(R3) ;NONE SPACED YET. CLNAGN: MOVB #CLNTMO,S.VITM(R4) ;CHECK SUBCYCLES AND RITM8=.-2 MOVB #CLNCYC,S.VSTS(R4) ; SUBCYCLE TIMEOUT. RSTS9=.-2 BR AGAIN ; .. CLEAN TAPE. CLNISR: MOV CMDB2(R2),-(SP) ;UPDATE SUB RBPCR(R2),(SP) ; BLOCKS SPACED ADD (SP)+,CLNED(R3) ; COUNT. TSTB PRVDIR(R3) ;SPACE REV? BEQ FWDCLN ;IF EQ, NO - SPACE FWD? ;TAPE CLEAN - SPACING REV. TST RBPCR(R2) ;COMPLETED REQUEST? BEQ REVDON ;IF EQ, YES. BIT #X0.BOT,XST0(R2) ;BOT? BNE REVDON ;IF NE, DONE. POSAGN: MOV CLNCNT(R3),-(SP) ;SETUP SUB CLNED(R3),(SP) ; REMAINING MOV (SP)+,CMDB2(R2) ; SPACE BR CLNAGN ; COUNT. REVDON: MOV CLNED(R3),CLNCNT(R3) ;SETUP FOR TSTB PRVDIR+1(R3) ;READ FWD REQUEST? BNE 100$ ;IF NE, READ REV. DEC CLNCNT(R3) ;SPACE N-1. BR 110$ ; .. CONT. 100$: INC CLNCNT(R3) ;SPACE N+1. 110$: MOV #CC.SRF,(R2) ;TAPE CLEAN (FWDSPC OVER CLNR). BR CLNSET ; . . CONT. FWDCLN: TST RBPCR(R2) ;REPOSITIONED FWD? BNE POSAGN ;IF NE, NO. FWDPOS: MOV CMDPK1(R3),(R2) ;SETUP CMD PKT BIC #CM.RTY,(R2) ;COMMAND WORD AND MOV CMDPK2(R3),CMDB2(R2) ; LO ORD BUF @. MOVB #1,S.VSTS(R4) ;ONE READ RSTS10=.-2 MOVB #RDTMO,S.VITM(R4) ; TIMEOUT AND RITM9=.-2 MOV CLNRTN(R3),INTADD(R3) ; > INTRPT PROCESSING. AGAIN: JMP INITIO ;RE-INITITIATE I/O. .PAGE ; TERMINATION CODE 5 - RECOVERABLE ERROR: TAPE NOT MOVED TCL5ER:CALL MSDVER ;LOG DEVICE ERROR DECB RTTBL(R3) ;DECREMENT RETRY COUNT BNE AGAIN ;IF NE RETRIES LEFT PARERR: MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR. BR TCEND ;END REQUEST. ; TERMINATION CODE 6 - UNRECOVERABLE ERROR TCL6ER: MOV #IE.FHE&377,R0 ;FATAL ERROR. CALL MSDVER ;LOG ERROR AND TCEND: JMP IODON ; END REQUEST. ; TERMINATION CODE 7 - FATAL CONTROLLER ERROR TCL7ER: CLR @S.CSR(R4) ;INITIALIZE DEVICE - ELSE UNUSABLE. MOV #TCL6ER,SSRRTY(R3) ;END REQUEST WHEN DEVICE READY. BIS #CS.WSS,CSTAT(R3) ;WAIT FOR DEVICE READY: MOVB #5.,S.VITM(R4) ;TEST FOR DEV RDY AT 5 SEC INTRVL, RITM10=.-2 MOVB #240.,S.VSTS(R4) ; UP TO 240 TIMES - 20 MINS.V RSTS11=.-2 MOVB S.VITM(R4),S.VCTM(R4) ;START TIMER RITM11=.-4 RCTM5=.-2 RETURN .PAGE ; ; MOUNT COMPLETION ; IMOUNT: BIT #M.SER,U.CW2(R5) ;OFFLINE? BNE 10$ ;IF NE YES, IT'S FATAL HERE BIT #M.BOT,U.CW2(R5) ;BOT? BEQ 10$ ;IF EQ, NO. BICB #US.PWF,U.STS(R5) ;ELSE RESET PWFLD IND BR ISTAT ; AND END REQUEST. 10$: MOV #IE.FHE&377,R0 ;NO, SET FATAL ERROR ; ; STATUS EXIT FOR SET, SENSE, MOUNT AND SET ; ISTAT: MOV U.CW2(R5),R1 ;SET STATUS WORD IN R1 BR IODON ; ;+ ; **- IRWDU - SUCCESSFUL IO.RWD/IO.RWU RESETS US.PWF INDICATION ;- IRWDU: TST R0 ;SUCCESSFUL RWD/RWU? BMI 10$ ;IF MI, NO. BICB #US.PWF,U.STS(R5) ;ELSE RESET PWFLD IND, INCB PRVDIR(R3) ; Pre dir - REV. 10$: BIC #M.RWD,U.CW2(R5) ;RWND, IF ANY, OVER. BR IODON ;END REQUEST. .PAGE ; ; SPACE BLOCKS COMPLETION ; ISPCB: BIT #M.PEOV,U.CW2(R5) ;PEOV? BEQ IOCOM ;IF EQ, NO. MOV #SBRPOS,INTADD(R3) ;RETURN @ AFTER BACKSPACE. BR BCKSPC ;SETUP REQUEST. ;+ ; **-SBRPOS - POSITIONED AEOV SPACING VIA BLOCKS. ;- SBRPOS: CLR R1 ;NO BLOCKS SPACED, BR NDAEOV ; AEOV ENDUP. ;+ ; **- ISPCF - SPACE FILES COMPLETION ;- ISPCF: BIT #CC.STR-CC.STF,(R2) ;SPACING REVERSE? BNE SFREV ;IF NE, YES. BIT #CS.SFB,CSTAT(R3) ;SPACING FILES VIA BLOCKS? BNE SPCFB ;IF NE, YES. BIT #M.PEOV,U.CW2(R5) ;PEOV? BEQ IOCOM ;IF NE, NO. SUB RBPCR(R2),SPCNT(R3) ;SPACED FILE COUNT. NDSPFB: MOV #SFRPOS,INTADD(R3) ;RETURN @ AFTER BACKSPACE. BCKSPC: MOV #CC.SRR,(R2) ;BACKSPACE MOV #1,CMDB2(R2) ; 1 BLOCK. MOVB #15.,S.VSTS(R4) ;WAIT UP TO 15 SUBCYCLES RSTS12=.-2 MOVB #4,S.VITM(R4) ; 4 SECONDS PER SUBCYCLE. RITM12=.-2 BR AGAIN ;ISSUE I/O. ;+ ; **-SFRPOS - RETURN AFTER REPOSITIONING TO AEOV FOR SPACE FILES ;- SFRPOS: DEC SPCNT(R3) ;SPACED FILE COUNT MOV SPCNT(R3),R1 ; TO REQUESTOR. NDAEOV: BIC #M.PEOV,U.CW2(R5) ;NOT PEOV, BIS #M.AEOV,U.CW2(R5) ; BUT AEOV. MOV #IE.EOV&377,R0 ;INDICATE AEOV, BR IODON ; END REQUEST. SPCFB: MOV #ISPCFB,INTADD(R3) ;SPC FILES VIA BLOCK SERVICING. ISPCFB: INC SPACED(R3) ;SPACED ONE MORE FILE. BIT #M.PEOV,U.CW2(R5) ;PEOV? BNE 10$ ;IF NE, YES. CMP SPACED(R3),SPCNT(R3) ;DONE? BNE AGAIN ;IF NE, NO. MOV #IS.SUC&377,R0 ;R0 - RETURN CODE, MOV SPCNT(R3),R1 ;R1 - SPACED COUNT, BR IODON ; END REQUEST. 10$: MOV SPACED(R3),SPCNT(R3) ;SPACED FILE COUNT. BR NDSPFB ;REPOSITION TO AEOV. SFREV: BIT #M.BOT,U.CW2(R5) ;BACKED INTO BOT? BEQ IOCOM ;IF EQ, NO. MOV #IS.SUC&377,R0 ; ELSE - IS.SUC IF BOT. ; ; COMMON EXIT ROUTINE FOR ALL ROUTINES REQUIRING STATUS ; IOCOM: MOV U.CNT(R5),R1 ;RETRIEVE REQUESTED COUNT SUB RBPCR(R2),R1 ; LESS RESIDUAL COUNT. ; ; COMMON EXIT FOR ALL FUNCTIONS ; IODON: CALL MSDINT ;CALL DIAGNOSTIC COMPLETION MOV RTTBL(R3),R2 ; R2 - TOTAL RTRYS, RTRYS LEFT. BIC #CS.CIP,CSTAT(R3) ;CLEAR COMMAND IN PROGRESS CALL @EIODON ;CALL COMPLETION JMP MSINI ;GO CHECK FOR ANOTHER REQUEST .PAGE ;+ ; **-MSDVER/MSDTER- LOG DEVICE ERRORS. ; ; THE DRIVER LOGS THE COMMAND PACKET, DEVICE STATUS REGISTER AND ; MESSAGE PACKET (INCLUDING EXTENDED STATUS REGISTERS) LOCATED ; IN THE DRIVER DATA BASE. ; ; INPUT: ; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS ; R5 = UCB ADDRESS ; ; ;- .ENABL LSB MSDVER: MOV R2,-(SP) ;SAVE R2. MOV DVERR,-(SP) ;(SP) - @ TO LOG DEVICE ERRORS. BR 10$ ; MSDTER: MOV R2,-(SP) ;SAVE R2. MOV DVTMO,-(SP) ;(SP) - @ TO LOG DEVICE TIMEOUTS. 10$: BIT #CS.UMD,CSTAT(R3) ;USER MODE DIAGNOSTIC IN PROGRESS BEQ 20$ ;IF EQ NO TST (SP)+ ;MAINTAIN TST (SP)+ ; STACK. RETURN ;RETURN TO THE CALLER 20$: MOV CMDPTR(R3),R2 ; > ERR LOG DATA. CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINE MOV (SP)+,R2 ;RESTORE R2. RETURN ; .DSABL LSB .PAGE ;+ ; **-MSDINT- DIAGNOSTIC REGISTER PASS ROUTINE ; ; IF ENTRY WAS FROM A DIAGNOSTIC CONTROL FUNCTION, THEN MOVE THE ; I/O PACKET WORDS 17 & 20 TO WORDS 20 & 21 FOR THE $CRPAS ROUTINE. ; ; THE DRIVER PASSES THE COMMAND PACKET, DEVICE STATUS REGISTER ; AND MESSAGE PACKET (INCLUDING XTND STS REGS) VIA THE $CRPAS ROUTINE. ; ; INPUTS: ; ; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS ; R5 = UCB ADDRESS ;- MSDINT: BIT #CS.UMD,CSTAT(R3) ;DIAGNOSTIC OPERATION? BEQ 30$ ;IF EQ NO MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV S.VPKT(R4),R1 ;GET I/O PACKET ADDRESS RPKT2=.-2 MOV CMDPTR(R3),R2 ; > DEVICE PACKETS. CMPB #IO.EOF/256.,I.FCN+1(R1) ;WRITE EOF FUNCTION? BEQ 10$ ;IF EQ YES CMPB #IO.RWD/256.,I.FCN+1(R1) ;REWIND FUNCTION? BEQ 10$ ;IF EQ YES CALL @CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTICS BR 20$ ;GO TO EXIT 10$: MOV I.PRM+14(R1),I.PRM+16(R1) ;MOVE PACKET WD20 TO WD21 MOV I.PRM+12(R1),I.PRM+14(R1) ;MOVE PACKET WD17 TO WD20 CALL @CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTICS MOV S.VPKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS RPKT3=.-2 MOV I.PRM+14(R1),I.PRM+12(R1) ;MOVE WD20 BACK TO WD 17 MOV I.PRM+16(R1),I.PRM+14(R1) ;MOVE WD21 BACK TO WD20 20$: MOV (SP)+,R2 ;RESTORE R2. MOV (SP)+,R1 ;RESTORE R1. 30$: RETURN ;EXIT TO CALLER .PAGE ;+ ;**-TRPHYS-TRANSLATE D-SPACE ADDRESS TO PHYSICAL ADDRESS ; ; THIS ROUTINE IS CALLED TO TRANSLATE A KERNEL DATA SPACE ADDRESS TO ; EQUIVALENT PHYSICAL ADDRESS. IN UNIBUS SYSTEMS, THE UMRS MAP DATA ; SPACE, SO THE VIRTUAL ADDRESS IS OK. IN ALL NON-I/D SYSTEMS, THE ; VIRTUAL -> PHYSICAL MAPPING OF EXEC ADDRESSES IS DIRECT. THE ONLY ; SITUATION REQUIRING TRANSLATION IS THEREFORE AN I/D SYSTEM RUNNING ; ON A Q-BUS. ; ; CALLING SEQUENCE: ; ; CLR -(SP) ; CLEAR HI-ORD ADDRESS AREA. ; MOV ...,-(SP) ;PUSH ADDRESS TO TRANSLATE ; CALL TRPHYS ;TRANSLATE ; MOV (SP)+,... ; GET TRANSLATED LO-ORD ; MOV (SP)+,... ; AND HI-ORD ADDRESS. ; ;- TRPHYS: ; REFERENCE LABEL BIT #DV.EXT,U.CW1(R5) ; 22 bit physical @ (Q bus)? BEQ 10$ ; IF EQ, No - UNIBUS (UMRs), no translation BIT #F2.DAS,@FMSK2 ; Data space? BEQ 10$ ; IF EQ, Non I/D, no translation. BIT #160000,2(SP) ; IS THIS MAPPED TO LOW MEMORY? BEQ 10$ ; YES, NO TRANSLATION NEEDED MOV R0,-(SP) ; Save R0 MOV R1,-(SP) ; and R1. MOV @SCMOF,R1 ; Get 32-wd block addr of D-space. CLR R0 ; and R0=0 for @ translation. SUB #200,R1 ; R1 - @ D space starting at virtual 20000 ASHC #6,R0 ; Translate the D pool @ ADD R1,6(SP) ; and ADC R0 ; return it BIC #^C<3>,R0 ; (18 bit phys @) MOV R0,10(SP) ; to user. MOV (SP)+,R1 ; Restore R1 MOV (SP)+,R0 ; and R0. 10$: RETURN ;RETURN TO CALLER .PAGE ;+ ; **-MSKRB - CONTROLLER STATUS CHANGE ROUTINE ; **-MSUCB - UNIT STATUS CHANGE ROUTINE ; ; The status change routines are NOPS and are provided only as a ; mechanism to gain control at MSKRB to translate the exec vector. ;- MSKRB: BCS MSUCB ; IF CS - offline call, nop. TST EXEVEC ; Exec vector translated ? BNE MSUCB ; IF NE, Yes - don't repeat. MOV @#112,R0 ; R0 > table of entries MOV (R0),R0 ; and apr bias (1st word of table). MOV KINAR6,-(SP) ; Save I-space mapping. MOV (R0),KINAR6 ; Map common through I-space APR6. MOV #EXEVEC,R3 ; R3 > Exec vector and MOV #EXEVCL,R2 ; R2 = length of vector area. CALL @#140004 ; Translate the vectors. MOV (SP)+,KINAR6 ; Restore I-space mapping. ; Patch driver SCB references MOV #SCBPAT,R0 ; R0 > patch table. 10$: MOV (R0)+,R2 ; R2 > driver @ to patch BEQ MSUCB ; IF EQ (R0> table terminator), end. MOV @(R0)+,(R2) ; Else - patch driver location BR 10$ ; and continue till driver patched. MSUCB: JMP MSPWF ; Continue. .END